/**
* Copyright (c) 2016-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.keyframes.deserializers;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import android.util.JsonReader;
import com.facebook.keyframes.model.KFImage;
/**
* Deserializer for {@link KFImage}. This is the root image object deserializer and contains the
* {@link #deserialize(InputStream)} method, which takes an {@link InputStream} and attempts to
* deserialize a full {@link KFImage} object from it.
*/
public class KFImageDeserializer {
/**
* Given an input stream, attempt to deserialize a {@link KFImage} and return it.
* @param inputStream An input stream containing JSON for a {@link KFImage}
* @return A deserialized {@link KFImage} object
* @throws IOException
*/
public static KFImage deserialize(InputStream inputStream) throws IOException {
JsonReader reader = new JsonReader(new InputStreamReader(inputStream));
return readObject(reader);
}
static KFImage readObject(JsonReader reader) throws IOException {
reader.beginObject();
KFImage.Builder builder = new KFImage.Builder();
while (reader.hasNext()) {
String name = reader.nextName();
switch (name) {
case KFImage.FRAME_RATE_JSON_FIELD:
builder.frameRate = reader.nextInt();
break;
case KFImage.FRAME_COUNT_JSON_FIELD:
builder.frameCount = reader.nextInt();
break;
case KFImage.FEATURES_JSON_FIELD:
builder.features =
KFFeatureDeserializer.LIST_DESERIALIZER.readList(reader);
break;
case KFImage.ANIMATION_GROUPS_JSON_FIELD:
builder.animationGroups =
KFAnimationGroupDeserializer.LIST_DESERIALIZER.readList(reader);
break;
case KFImage.CANVAS_SIZE_JSON_FIELD:
builder.canvasSize = CommonDeserializerHelper.readFloatArray(reader);
break;
case KFImage.KEY_JSON_FIELD:
builder.key = reader.nextInt();
break;
case KFImage.BITMAPS_JSON_FIELD:
builder.bitmaps = readBitmaps(reader);
break;
default:
reader.skipValue();
}
}
reader.endObject();
return builder.build();
}
private static Map<String, Bitmap> readBitmaps(JsonReader reader) throws IOException {
reader.beginObject();
Map<String, Bitmap> bitmaps = new HashMap<>();
while (reader.hasNext()) {
String name = reader.nextName();
byte[] bytes = Base64.decode(reader.nextString(), Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
bitmaps.put(name, bitmap);
}
reader.endObject();
return bitmaps;
}
}